rm(list = ls())
### Chargement des librairies
library(ggplot2)
library(patchwork)
library(dplyr)
##
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
##
## filter, lag
## Les objets suivants sont masqués depuis 'package:base':
##
## intersect, setdiff, setequal, union
library(FactoMineR)
library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
##
## Attachement du package : 'randomForest'
## L'objet suivant est masqué depuis 'package:dplyr':
##
## combine
## L'objet suivant est masqué depuis 'package:ggplot2':
##
## margin
library(rpart)
library(rpart.plot)
library(DMwR)
## Le chargement a nécessité le package : lattice
## Le chargement a nécessité le package : grid
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
### Chargement des fichiers csv
out1 <- read.csv("1out-2025-02-18T20:36:23.csv")
out2 <- read.csv("2out-2025-02-19T06:00:17.csv")
out3 <- read.csv("3out-2025-02-19T06:29:11.csv")
out4 <- read.csv("4out-2025-02-19T06:29:24.csv")
out5 <- read.csv("5out-2025-02-19T07:06:37.csv")
out6 <- read.csv("6out-2025-02-19T07:06:46.csv")
out7 <- read.csv("7out-2025-02-19T08:58:23.csv")
out8 <- read.csv("8out-2025-02-19T08:58:36.csv")
out9 <- read.csv("9out-2025-02-19T08:58:46.csv")
out10 <- read.csv("10out-2025-02-19T09:24:08.csv")
out11 <- read.csv("11out-2025-02-19T09:24:30.csv")
out12 <- read.csv("12out-2025-02-19T09:24:47.csv")
out1_c <- read.csv("1crop_out-2025-03-12T10:01:32.csv")
out2_c <- read.csv("2crop_out-2025-03-12T10:04:26.csv")
out3_c <- read.csv("3crop_out-2025-03-12T10:04:31.csv")
out4_c <- read.csv("4crop_out-2025-03-12T10:04:37.csv")
out5_c <- read.csv("5crop_out-2025-03-12T10:04:43.csv")
out6_c <- read.csv("6crop_out-2025-03-12T10:04:47.csv")
out7_c <- read.csv("7crop_out-2025-03-12T10:04:53.csv")
out8_c <- read.csv("8crop_out-2025-03-12T10:05:29.csv")
out9_c <- read.csv("9crop_out-2025-03-12T10:05:33.csv")
out10_c <- read.csv("10crop_out-2025-03-12T10:05:38.csv")
out11_c <- read.csv("11crop_out-2025-03-12T10:05:43.csv")
head(out1)
## Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1 mvs-73.npy 0.3334223 0.014148425 0.6952196 0.2584659
## 2 mvs-5.npy 0.2432790 -0.001542530 0.6265431 0.3924669
## 3 mvs-22.npy 0.1263214 -0.004756871 0.4421079 0.3101159
## 4 mvs-192.npy 0.3362334 0.007676561 0.7386447 0.3166199
## 5 mvs-27.npy 1.8481767 0.151122020 3.0685975 2.1408885
## 6 mvs-53.npy 0.2685231 0.006961711 0.6199876 0.3306809
## Norme
## 1 0.3671036
## 2 0.3139665
## 3 0.1579847
## 4 0.3790439
## 5 2.7196242
## 6 0.3079621
head(out1_c)
## Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1 mvs-73.npy 0.23076923 0.00000000 0.6761916 0.0000000
## 2 mvs-5.npy -0.07228916 0.00000000 0.3394940 0.0000000
## 3 mvs-22.npy 0.01935484 -0.02580645 0.1377688 0.2257143
## 4 mvs-192.npy 0.13580247 0.00000000 0.4375320 0.1571348
## 5 mvs-27.npy 2.69892473 0.30107527 5.3957071 3.6537945
## 6 mvs-53.npy 0.12195122 -0.01829268 0.7222972 0.1736467
## Norme
## 1 0.23076923
## 2 0.07228916
## 3 0.04516129
## 4 0.16049383
## 5 5.63192787
## 6 0.14529529
r1 <- ggplot(out1, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out1") + geom_point()
r2 <- ggplot(out2, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out2") + geom_point()
r3 <- ggplot(out3, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out3") + geom_point()
r4 <- ggplot(out4, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out4") + geom_point()
r5 <- ggplot(out5, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out5") + geom_point()
r6 <- ggplot(out6, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out6") + geom_point()
(r1 | r2 | r3)/(r4|r5|r6) + plot_annotation(title = "Répartition des vecteurs vitesses")
r7 <- ggplot(out7, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out7") + geom_point()
r8 <- ggplot(out8, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out8") + geom_point()
r9 <- ggplot(out9, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out9") + geom_point()
r10 <- ggplot(out10, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out10") + geom_point()
r11 <- ggplot(out11, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out11") + geom_point()
r12 <- ggplot(out12, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out12") + geom_point()
(r7|r8|r9)/(r10|r11|r12)+plot_annotation(title = "Répartition des vecteurs vitesses")
Nous pouvons remarquer qu’il y a un déplacement vers la droite ce qui correspond bien à la vidéo lorsque que nous la regardons.
Nous remarquons aussi que seul l’encodage h264 est supporté, l’encodage h265 est inutile.
# Créer une liste des noms des dataframes
out_list <- list(out1, out2, out3, out4, out5, out6, out7, out8, out9, out10, out11)
# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list)) {
outX <- out_list[[i]] # Sélectionner le dataframe
# Calculer les angles
angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
# Convertir en dataframe
df <- data.frame(angle = angles)
# Convertir les angles en degrés
df$angle_degrees <- (df$angle * 180 / pi) %% 360
# Créer le graphique
p <- ggplot(df, aes(x = angle_degrees)) +
geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
coord_polar(start = 0) +
theme_minimal() +
labs(title = paste("Densité des directions - out", i),
x = "Direction (degrés)", y = "Densité")
# Afficher le graphique
print(p)
}
Cela devient encore plus claire en affichant la densité (le degré 0 correspond à un déplacement vers la droite)
On va analyser les images sur laquelle il y a le météore (i.e de 98 à 104)
# Sélectionner les fichiers de "mvs-98.npy" à "mvs-104.npy"
out1_f <- out1 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out2_f <- out2 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out3_f <- out3 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out4_f <- out4 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out5_f <- out5 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out6_f <- out6 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out7_f <- out7 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out8_f <- out8 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out9_f <- out9 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out10_f <- out10 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out11_f <- out11 %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
head(out1_f)
## Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1 mvs-99.npy 1.4873308 0.066990628 2.6923592 1.9005170
## 2 mvs-102.npy 0.3723647 0.012446025 0.7712963 0.3614628
## 3 mvs-101.npy 0.2968710 0.007377258 0.6264239 0.2944350
## 4 mvs-104.npy 0.4562959 0.003293641 0.8690861 0.4321033
## 5 mvs-100.npy 0.1037510 0.003724395 0.4006968 0.2515966
## 6 mvs-103.npy 0.3717236 0.014826582 0.7548449 0.3425402
## Norme
## 1 2.2181330
## 2 0.4082041
## 3 0.3326096
## 4 0.5176175
## 5 0.1361405
## 6 0.4076394
r1_f <- ggplot(out1_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out1") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r2_f <- ggplot(out2_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out2") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r3_f <- ggplot(out3_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out3") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r4_f <- ggplot(out4_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out4") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r5_f <- ggplot(out5_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out5") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r6_f <- ggplot(out6_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out6") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
(r1_f | r2_f | r3_f)/(r4_f|r5_f|r6_f) + plot_annotation(title = "Répartition des vecteurs vitesses")
r7_f <- ggplot(out7_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y,label = Fichier)) + labs(title = " Out7") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r8_f <- ggplot(out8_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out8") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r9_f <- ggplot(out9_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out9") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r10_f <- ggplot(out10_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out10") +geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r11_f <- ggplot(out11_f, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out11") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
(r7_f|r8_f|r9_f)/(r10_f|r11_f)+plot_annotation(title = "Répartition des vecteurs vitesses")
# Créer une liste des noms des dataframes
out_list_f <- list(out1_f, out2_f, out3_f, out4_f, out5_f, out6_f, out7_f, out8_f, out9_f, out10_f, out11_f)
# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list_f)) {
outX <- out_list_f[[i]] # Sélectionner le dataframe
# Calculer les angles
angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
# Convertir en dataframe
df <- data.frame(angle = angles)
# Convertir les angles en degrés
df$angle_degrees <- (df$angle * 180 / pi) %% 360
# Créer le graphique
p <- ggplot(df, aes(x = angle_degrees)) +
geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
coord_polar(start = 0) +
theme_minimal() +
labs(title = paste("Densité des directions - out", i),
x = "Direction (degrés)", y = "Densité")
# Afficher le graphique
print(p)
}
r1_c <- ggplot(out1_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out1") + geom_point()
r2_c <- ggplot(out2_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out2") + geom_point()
r3_c <- ggplot(out3_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out3") + geom_point()
r4_c <- ggplot(out4_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out4") + geom_point()
r5_c <- ggplot(out5_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out5") + geom_point()
r6_c <- ggplot(out6_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out6") + geom_point()
(r1_c | r2_c | r3_c)/(r4_c|r5_c|r6_c) + plot_annotation(title = "Répartition des vecteurs vitesses")
r7_c <- ggplot(out1_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out1") + geom_point()
r8_c <- ggplot(out2_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out2") + geom_point()
r9_c <- ggplot(out3_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out3") + geom_point()
r10_c <- ggplot(out4_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = "Out4") + geom_point()
r11_c <- ggplot(out5_c, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y)) + labs(title = " Out5") + geom_point()
#geom_errorbar(aes(ymin = Vecteur.Moyen.Y - Ecart.Type.Y, ymax = Vecteur.Moyen.Y + Ecart.Type.Y), width = 0.2) à rajouter pour l'écart type
(r7_c | r8_c | r9_c)/(r10_c|r11_c) + plot_annotation(title = "Répartition des vecteurs vitesses")
Les vecteurs senmblent cette fois-ci centré en zéro, il n’y a donc pas de déplacement en arrière plan, ou plus léger.
# Créer une liste des noms des dataframes
out_list_c <- list(out1_c,out2_c, out3_c, out4_c, out5_c, out6_c, out7_c, out8_c, out9_c, out10_c, out11_c)
# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list_c)) {
outX <- out_list_c[[i]] # Sélectionner le dataframe
# Calculer les angles
angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
# Convertir en dataframe
df <- data.frame(angle = angles)
# Convertir les angles en degrés
df$angle_degrees <- (df$angle * 180 / pi) %% 360
# Créer le graphique
p <- ggplot(df, aes(x = angle_degrees)) +
geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
coord_polar(start = 0) +
theme_minimal() +
labs(title = paste("Densité des directions - out", i),
x = "Direction (degrés)", y = "Densité")
# Afficher le graphique
print(p)
}
# Sélectionner les fichiers de "mvs-98.npy" à "mvs-104.npy"
out1_fc <- out1_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out2_fc <- out2_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out3_fc <- out3_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out4_fc <- out4_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out5_fc <- out5_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out6_fc <- out6_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out7_fc <- out7_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out8_fc <- out8_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out9_fc <- out9_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out10_fc <- out10_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
out11_fc <- out11_c %>% filter(Fichier %in% paste0("mvs-", 98:104, ".npy"))
head(out1_fc)
## Fichier Vecteur.Moyen.X Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y
## 1 mvs-99.npy 1.77906977 -0.11627907 4.5708916 3.2328927
## 2 mvs-102.npy 0.02739726 -0.08219178 1.0333163 0.7071731
## 3 mvs-101.npy 0.16463415 0.01829268 0.7008483 0.3018755
## 4 mvs-104.npy 0.04687500 0.00000000 0.4653523 0.7288690
## 5 mvs-100.npy 0.11450382 0.04580153 0.7580733 0.5222178
## 6 mvs-103.npy 0.29370629 0.02097902 1.3783144 0.9568928
## Norme
## 1 3.3499645
## 2 0.3162022
## 3 0.2317073
## 4 0.2404535
## 5 0.1695504
## 6 0.6182095
r1_fc <- ggplot(out1_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out1") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r2_fc <- ggplot(out2_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out2") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r3_fc <- ggplot(out3_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out3") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r4_fc <- ggplot(out4_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out4") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r5_fc <- ggplot(out5_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out5") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r6_fc <- ggplot(out6_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out6") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
(r1_fc | r2_fc | r3_fc)/(r4_fc|r5_fc|r6_fc) + plot_annotation(title = "Répartition des vecteurs vitesses")
r7_fc <- ggplot(out7_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y,label = Fichier)) + labs(title = " Out7") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r8_fc <- ggplot(out8_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out8") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r9_fc <- ggplot(out9_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out9") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r10_fc <- ggplot(out10_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = "Out10") +geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
r11_fc <- ggplot(out11_fc, aes(x = Vecteur.Moyen.X, y = Vecteur.Moyen.Y, label=Fichier)) + labs(title = " Out11") + geom_text(vjust = 1, hjust = 0.5, size = 2) + geom_point()
(r7_fc|r8_fc|r9_fc)/(r10_fc|r11_fc)+plot_annotation(title = "Répartition des vecteurs vitesses")
# Créer une liste des noms des dataframes
out_list_fc <- list(out1_fc, out2_fc, out3_fc, out4_fc, out5_fc, out6_fc, out7_fc, out8_fc, out9_fc, out10_fc, out11_fc)
# Boucle pour générer chaque histogramme polaire
for (i in seq_along(out_list_fc)) {
outX <- out_list_fc[[i]] # Sélectionner le dataframe
# Calculer les angles
angles <- atan2(outX$Vecteur.Moyen.Y, outX$Vecteur.Moyen.X)
# Convertir en dataframe
df <- data.frame(angle = angles)
# Convertir les angles en degrés
df$angle_degrees <- (df$angle * 180 / pi) %% 360
# Créer le graphique
p <- ggplot(df, aes(x = angle_degrees)) +
geom_histogram(aes(y = after_stat(density)), bins = 36, fill = "blue", alpha = 0.7) +
coord_polar(start = 0) +
theme_minimal() +
labs(title = paste("Densité des directions - out", i),
x = "Direction (degrés)", y = "Densité")
# Afficher le graphique
print(p)
}
Une idée maintenant est de lancer une ACP sur un dataframe contenant des informations sur les vecteurs vitesses mais aussi les paramètres d’encodage pour voir lesquelles influe dessus.
On va mettre les variables preset, bitrate, encodage, pix_fmt et capture en facteur, l’objectif va être de déterminer quelle facteur permet de capturer le météore.
### Chargement du dataframe
merge <- read.csv("merged_results2.csv", row.names = NULL)
head(merge)
## Numéro Framerate Preset Images.Clés Bitrate Encodage Pix_fmt
## 1 8 30 p7 10 variable h264 gray
## 2 8 30 p7 10 variable h264 gray
## 3 8 30 p7 10 variable h264 gray
## 4 8 30 p7 10 variable h264 gray
## 5 8 30 p7 10 variable h264 gray
## 6 8 30 p7 10 variable h264 gray
## Dossier Fichier Vecteur.Moyen.X Vecteur.Moyen.Y
## 1 8crop_out-2025-03-12T10:05:29 mvs-73.npy 0.00000000 0.00000000
## 2 8crop_out-2025-03-12T10:05:29 mvs-5.npy 0.00000000 0.00000000
## 3 8crop_out-2025-03-12T10:05:29 mvs-22.npy -0.07462687 -0.05970149
## 4 8crop_out-2025-03-12T10:05:29 mvs-192.npy -0.13377926 0.00000000
## 5 8crop_out-2025-03-12T10:05:29 mvs-27.npy 0.00000000 0.00000000
## 6 8crop_out-2025-03-12T10:05:29 mvs-53.npy 0.00000000 0.00000000
## Écart.Type.X Écart.Type.Y Norme Capture
## 1 0.0000000 0.0000000 0.00000000 0
## 2 0.0000000 0.0000000 0.00000000 0
## 3 0.2627883 0.5521716 0.13432836 0
## 4 0.5506118 0.0000000 0.22742475 0
## 5 0.0000000 0.0000000 0.00000000 0
## 6 0.0789337 0.0000000 0.00623053 0
### Pré-traitement des données
merge_f <- select(merge, -c(Dossier,Fichier)) %>% filter(Norme!=0)
merge_f$Preset <- as.factor(merge_f$Preset)
merge_f$Bitrate <- as.factor(merge_f$Bitrate)
merge_f$Encodage <- as.factor(merge_f$Encodage)
merge_f$Pix_fmt <- as.factor(merge_f$Pix_fmt)
merge_f$Capture <- as.factor(merge_f$Capture)
head(merge_f)
## Numéro Framerate Preset Images.Clés Bitrate Encodage Pix_fmt Vecteur.Moyen.X
## 1 8 30 p7 10 variable h264 gray -0.07462687
## 2 8 30 p7 10 variable h264 gray -0.13377926
## 3 8 30 p7 10 variable h264 gray 0.00000000
## 4 8 30 p7 10 variable h264 gray 2.40495868
## 5 8 30 p7 10 variable h264 gray 0.06185567
## 6 8 30 p7 10 variable h264 gray 0.26404494
## Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y Norme Capture
## 1 -0.059701493 0.2627883 0.55217157 0.13432836 0
## 2 0.000000000 0.5506118 0.00000000 0.22742475 0
## 3 0.000000000 0.0789337 0.00000000 0.00623053 0
## 4 -0.157024793 5.4493589 2.95701509 4.30822254 0
## 5 0.000000000 0.3838966 0.00000000 0.06185567 0
## 6 -0.005617978 0.7953159 0.07474233 0.26637199 0
res.pca <- PCA(merge_f, quanti.sup = 1,quali.sup = c(3,5, 6,7,13),graph = FALSE)
barplot(res.pca$eig[,2])
plot(res.pca, choix="var")
Le premier axe représente les vecteurs de normes et écart type élevés à droite et à gauche ceux de norme et écart type faible. Le second axe est basé sur le nombre d’images clé et de framerate.
plot(res.pca, choix="ind", select="cos2 0.8" )
plot(res.pca, choix="ind", habillage=13, select="cos2 0.8", cex=0.9)
Faire l’analyse en composantes principales sur l’ensemble des frames n’as pas vraiment de sens, nous allons nous restreindre aux frames où le météore apparaît.
### Pré-traitement des données
merge_fc <-filter(merge, Fichier %in% paste0("mvs-", 96:104, ".npy")) %>% select(-c(Numéro, Dossier,Fichier))
merge_fc$Preset <- as.factor(merge_fc$Preset)
merge_fc$Bitrate <- as.factor(merge_fc$Bitrate)
merge_fc$Encodage <- as.factor(merge_fc$Encodage)
merge_fc$Pix_fmt <- as.factor(merge_fc$Pix_fmt)
merge_fc$Capture <- as.factor(merge_fc$Capture)
head(merge_fc)
## Framerate Preset Images.Clés Bitrate Encodage Pix_fmt Vecteur.Moyen.X
## 1 30 p7 10 variable h264 gray 1.63636364
## 2 30 p7 10 variable h264 gray -0.11371237
## 3 30 p7 10 variable h264 gray 0.02912621
## 4 30 p7 10 variable h264 gray 0.82954545
## 5 30 p7 10 variable h264 gray 0.00000000
## 6 30 p7 10 variable h264 gray 0.01067616
## Vecteur.Moyen.Y Écart.Type.X Écart.Type.Y Norme Capture
## 1 0.09848485 3.8598020 1.6916007 2.44492075 0
## 2 0.02341137 0.5728932 0.7424900 0.23107080 1
## 3 0.02912621 0.2712661 0.3254962 0.08493919 0
## 4 -0.23295455 2.3096713 2.3421155 1.27558217 1
## 5 0.00000000 0.0000000 0.0000000 0.00000000 0
## 6 -0.04270463 0.3210745 0.4110898 0.08672355 1
res.pca2 <- PCA(merge_fc, quali.sup = c(2,4, 5,6,12),graph = FALSE)
plot(res.pca2, choix="var")
On peut plus ou moins la même interpération des axes que précedemment, sauf pour le premier axe qui mets en opposition le Vecteur.Moyen.X et le Vecteur.Moyen.Y
plot(res.pca2, choix="ind", habillage=12, select="cos2 0.8", cex=0.9)
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
Nous pouvons clairement déterminer deux “zones” où des météores sont capturer. Dans les deux cas, la norme est assez faible mais cela peut être un biais dû au vecteurs vitesses qui ont une norme très importante. Les groupes correspondent à ceux avec 5, 10 ou 15 images clés.
plot(res.pca2, choix="ind", habillage=4, select="cos2 0.8", cex=0.9)
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
La combinaison bitrate variable et 10 images clés offre un bon compromis pour capturer le météore. Mais nous n’avons pas assez de données pour en tirer une vrai conclusion.
plot(res.pca2, choix="ind", habillage=2, select="cos2 0.8", cex=0.9)
## Warning: ggrepel: 9 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
Il faut utiliser un preset slow ou p7 (encore plus slow) pour capturer le météore, le preset fast ne fonctionne pas du tout.
Nous pouvons conclure que pour capturer le météore Il faut utiliser un preset lent pour obtenir une compression meilleure, c’est à dire ou la qualité est meilleure, il est difficile de trouver d’autre facteur déterminant à cause du faible nombres de données et qui sont toutes issus de la même vidéo.
### Pré-traitement des données
merge_fc_class <-filter(merge, Fichier %in% paste0("mvs-", 96:104, ".npy")) %>% select(-c(Numéro, Dossier,Fichier,Écart.Type.X, Écart.Type.Y))
merge_fc_class$Preset <- as.factor(merge_fc_class$Preset)
merge_fc_class$Bitrate <- as.factor(merge_fc_class$Bitrate)
merge_fc_class$Encodage <- as.factor(merge_fc_class$Encodage)
merge_fc_class$Pix_fmt <- as.factor(merge_fc_class$Pix_fmt)
merge_fc_class$Capture <- as.factor(merge_fc_class$Capture)
head(merge_fc_class)
## Framerate Preset Images.Clés Bitrate Encodage Pix_fmt Vecteur.Moyen.X
## 1 30 p7 10 variable h264 gray 1.63636364
## 2 30 p7 10 variable h264 gray -0.11371237
## 3 30 p7 10 variable h264 gray 0.02912621
## 4 30 p7 10 variable h264 gray 0.82954545
## 5 30 p7 10 variable h264 gray 0.00000000
## 6 30 p7 10 variable h264 gray 0.01067616
## Vecteur.Moyen.Y Norme Capture
## 1 0.09848485 2.44492075 0
## 2 0.02341137 0.23107080 1
## 3 0.02912621 0.08493919 0
## 4 -0.23295455 1.27558217 1
## 5 0.00000000 0.00000000 0
## 6 -0.04270463 0.08672355 1
Nous allons faire la classification sur les frames uniquement avec le météore, cela aura plus de sens.
table(merge_fc_class$Capture)
##
## 0 1
## 73 26
Les données sont mals répartis, on le rectifiera par la suite
# Création d'un échantillon train et d'un échantillon test
set.seed(1)
n <- nrow(merge_fc_class)
p <- ncol(merge_fc_class)-1
test.ratio <- .2 # ratio of test/train samples
n.test <- round(n*test.ratio)
n.test
## [1] 20
tr <- sample(1:n,n.test)
data.test <- merge_fc_class[tr,]
data.train <- merge_fc_class[-tr,]
print(table(data.train$Capture))
##
## 0 1
## 59 20
print(table(data.test$Capture))
##
## 0 1
## 14 6
fit_RF <- randomForest(Capture~.,data.train)
fit_RF
##
## Call:
## randomForest(formula = Capture ~ ., data = data.train)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 24.05%
## Confusion matrix:
## 0 1 class.error
## 0 55 4 0.06779661
## 1 15 5 0.75000000
plot(fit_RF)
En noire, erreur de classification totale, en rouge et verte les
erreurs de classification pour les 2 classes : vert pour la classe
capture et rouge pour la classe pas de capture.
Nous remarquons donc q’il y a beaucoup d’erreur pour la classe capture,
nous n’avons pas assez de données pour avoir une erreur faible.
### Prédiction
class_RF= predict(fit_RF, newdata=data.test, type="class")
### Table de confusion
table(class_RF, data.test$Capture)
##
## class_RF 0 1
## 0 14 3
## 1 0 3
### Acurracy
accuracy_RF = mean(class_RF == data.test$Capture)
accuracy_RF
## [1] 0.85
On va essayer de rééquilibrer le jeu de données
data.train.balanced <- SMOTE(Capture~., data.train)
table(data.train.balanced$Capture)
##
## 0 1
## 80 60
fit_RF2 <- randomForest(Capture~.,data.train.balanced)
fit_RF2
##
## Call:
## randomForest(formula = Capture ~ ., data = data.train.balanced)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 5%
## Confusion matrix:
## 0 1 class.error
## 0 79 1 0.0125
## 1 6 54 0.1000
plot(fit_RF2)
### Prédiction
class_RF2= predict(fit_RF2, newdata=data.test, type="class")
### Table de confusion
table(class_RF2, data.test$Capture)
##
## class_RF2 0 1
## 0 11 2
## 1 3 4
### Acurracy
accuracy_RF2 = mean(class_RF2 == data.test$Capture)
accuracy_RF2
## [1] 0.75
En réquilibrant le jeu de données on obtient des résultats sensiblement meilleures.
arbre=rpart(Capture~.,data.train.balanced,control=rpart.control(minsplit=5,cp=0))
printcp(arbre)
##
## Classification tree:
## rpart(formula = Capture ~ ., data = data.train.balanced, control = rpart.control(minsplit = 5,
## cp = 0))
##
## Variables actually used in tree construction:
## [1] Bitrate Framerate Norme Preset
## [5] Vecteur.Moyen.X Vecteur.Moyen.Y
##
## Root node error: 60/140 = 0.42857
##
## n= 140
##
## CP nsplit rel error xerror xstd
## 1 0.3500000 0 1.00000 1.00000 0.097590
## 2 0.1333333 1 0.65000 0.81667 0.094060
## 3 0.0833333 2 0.51667 0.63333 0.087695
## 4 0.0583333 3 0.43333 0.58333 0.085391
## 5 0.0444444 5 0.31667 0.48333 0.079918
## 6 0.0333333 8 0.18333 0.45000 0.077805
## 7 0.0083333 9 0.15000 0.38333 0.073070
## 8 0.0000000 11 0.13333 0.35000 0.070415
plotcp(arbre)
cp.opt <- arbre$cptable[which.min(arbre$cptable[, "xerror"]), "CP"]
cp.opt
## [1] 0
arbre.opt <- prune(arbre,cp.opt)
rpart.plot(arbre.opt, type=4)
Il est difficile d’obtenir des résultats intéressants du fait du peu de nombre de données, il faudrait avoir un dataframe mieux fourni.